/**
 * @Tick.as
 *
 * @author sodaChen mail:asframe@qq.com
 * @version 1.0
 * <br>Copyright (C), 2013 asFrame.com
 * <br>This program is protected by copyright laws.
 * <br>Program Name:ASFrame
 * <br>Date:2013-11-9
 */
package com.asframe.tick
{
	import com.asframe.fun.CallFunMap;
	import com.asframe.mgr.TimeMgr;

	import flash.display.Shape;
	import flash.events.Event;

	import ll.timer.TimerManager;

	/**
	 * 心跳对象，当添加了心跳 函数之后，会根据帧频进行有规律地跳动，直接容器不再有需要执行的函数。
	 * 自带了Timer功能，具备指定时间间隔和次数地进行执行回调函数。
	 * （这个类暂时废弃了，请使用TickMgr）
	 * Date:2013-11-9
	 */
	public class Tick
	{
		/** 心跳机制的动力机 **/
		private static var power:Shape = new Shape();
		/** 心跳集合 **/
		private static var tickFuns:CallFunMap = new CallFunMap();
		/** 心跳接口执行期，性能会比function稍微高一点点，同时具备顺序（先添加先执行） **/
		private static var executeTick:ExecuteTick = new ExecuteTick();

		private static function checkTickMap(isAdd:Boolean):void
		{
			if(isAdd && tickFuns.funCount == 1)
			{
				power.addEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
			else if(tickFuns.funCount == 0)
			{
				power.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
		}
		/**
		 * 添加心跳函数
		 * @param fun
		 *
		 */
		public static function addFun(fun:Function):void
		{
			TimerManager.add(33,fun);
//			tickFuns.addFunction(fun);
//			checkTickMap(true);
		}
		public static function start():void
		{
			power.addEventListener(Event.ENTER_FRAME,onEnterFrame);
		}
		public static function stop():void
		{
			power.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
		}
		/**
		 * 删除心跳函数
		 * @param fun
		 */
		public static function removeFun(fun:Function):void
		{
			TimerManager.remove(fun);
//			tickFuns.removeFunction(fun);
//			checkTickMap(false);
		}
		/**
		 * 添加实现ITick接口的实例进行心跳
		 * @param tick
		 *
		 */
		public static function addTick(tick:ITick):void
		{
			TimeMgr.addDelay(33,tick.tick);
//			executeTick.addTick(tick);
		}
		public static function removeTick(tick:ITick):void
		{
			TimeMgr.removeDelay(tick.tick);
//			executeTick.removeTick(tick);
		}

		private static function onEnterFrame(event:Event):void
		{
			tickFuns.calls();
			//有可能进行删除了，所以需要判断（一般游戏可能不会终止心跳机制，所以考虑这里不增加也行）
			checkTickMap(false);
		}
	}
}

